
// 定义一个存储缓存的结构
pub struct Cacher<T>
    where T: FnMut(u32) -> u32
{
    calculation: T,
    value: Option<u32>,
}

// 实现这个结构
impl<T> Cacher<T>
    where T: FnMut(u32) -> u32
{
    // 构造一个创建对象的方法，主要是访问私有变量 value、calculation
    pub fn new(calculation: T) -> Cacher<T> {
        Cacher {
            calculation: calculation,
            value: None,
        }
    }

    pub fn value(&mut self, arg : u32) -> u32 {
        match self.value {
            Some(value) => value,
            None => {
                let v = (self.calculation)(arg);
                self.value = Some(v);
                v
            }
        }
    }
}